/****************************************配置axios请求与响应的拦截封装********************************************** */
/*****************************************axios请求拦截封装：将所有请求接口（除登录外，给header配置token）************************************************** */
/**********************************axios响应拦截封装：将所有的返回接口进行状态码（除200外，其他全部提示报错/强制返回登录页）*************************************************************** */

// 导入axios
import axios from "axios";
// 导入Pluse框架的弹窗组件
import { ElMessage } from "element-plus";
// 导入router做强制跳转
import router from "@/router";

// 1.配置公共路由访问地址以及超时设置，如果有其他的公共配置，统一在此处设置
const $axios = axios.create({
    // 公共域名
    baseURL : 'http://localhost:9191',
    // 超时设置（一分钟未反馈响应，则认为链接超时）
    timeout : 60000
})

// 2.设置axios请求拦截器：对接口进行token配置
$axios.interceptors.request.use((config)=>{
    // 配置默认header请求头的数据格式
    config.headers['Content-Type'] = 'application/json;charset=utf-8';
    // 从本地缓存中提取登录后用户数据
    let user = JSON.parse(sessionStorage.getItem('user'))
    // 如果存储了用户数据，证明登录合法进入，就必须能够提取token
    if(user){
        // 给headers新增一个属性token
        config.headers['token'] = user.token
    }
    // 完成config配置后，返回
    return config;
    
} , (error) => {
    return Promise.reject(error);
} )

// 3.设置axios响应拦截器：对响应的结果状态码进行判断和输出
$axios.interceptors.response.use((response) => {
    // 提取响应的data数据 ===> apiPost里面的响应接口（code+msg+data）
    let res = response.data;

    // response.config.responseType数据类型的判断：文件数据/字符串数据
    if(response.config.responseType === 'blob'){
        // 直接输出给组件
        return res;
    }

    // 数据类型为字符串，则必须将其从JSON格式内解析之后才能给到组件使用
    if(typeof res === 'string'){
        // 如果res有数据则解析JSON格式，没有数据则直接赋值
        res = res ? JSON.parse(res) : res;
    }

    let user = JSON.parse( sessionStorage.getItem('user') )
    // switch状态码的判断
    // 报错： Unexpected lexical declaration in case block  no-case-declarations：在switch的case里面不能用let/const/function/class声明新的数据
    switch(res.code){
        case 401:
        case 403:
            // 此处为switch的或运算，res.code要么等于401或者等于403，都执行报错弹窗的输出
            ElMessage.error(res.msg);
            // router.push('/');
            // 需要根据当前登录者的角色前往不同的登录页面
            if( user && user.role === 'admin' ){
                router.push('/admin');
            }else{
                router.push('/home/login')
            }

            break;
        case 404: ElMessage.error('请求地址不存在，请重新发送请求'); break;
        case 500: ElMessage.error('无法链接服务端，请稍后再试'); break;



            // token失效
            // ElMessage({message:res.msg , type:'error' , showClose:true}).then(()=>{
            //     router.push('/login')
            // })
            // break;
    }
    // 将处理完的响应结果return出去
    return res;

} , (error) => {
    console.log('报错：'+error);
    return Promise.reject(error);
    
} )

// 导出axios
export default $axios;